package com.commonly.commonlyUsed.分布式.雪花算法生成分布式id;

import java.util.UUID;

/**
 * 主键生成辅助类
 * 雪花算法可以保证:
 * 1.所有生成的id按时间趋势递增
 * 2.整个分布式系统内不会产生重复id（因为有datacenterId和workerId来做区分）
 *
 * @author flydoos
 * @date 2019/4/1
 */
public class KeyUtils {
    /**
     * 分布式主键生成器
     */
    private static SnowFlake snowFlake;

    /**
     * 数据中心的标识ID，取值范围：0~31
     * 机器或进程的标识ID，取值范围：0~31
     * 两个标识ID组合在分布式环境中必须唯一
     */
    public static long DATA_CENTER_ID = 1/*Long.valueOf(BeanUtils.getProperty("snowflake.config.datacenterid"))*/;

    /**
     * 数据中心的标识ID，取值范围：0~31
     * 机器或进程的标识ID，取值范围：0~31
     * 两个标识ID组合在分布式环境中必须唯一
     */
    public static long MACHINE_ID = 1/*Long.valueOf(BeanUtils.getProperty("snowflake.config.machineid"))*/;

    /**
     * 静态实例化对象
     */
    static {
        snowFlake = new SnowFlake(DATA_CENTER_ID, MACHINE_ID);
        System.out.println("雪花算法：DATA_CENTER_ID："+DATA_CENTER_ID);
        System.out.println("雪花算法：MACHINE_ID："+MACHINE_ID);
    }

    /**
     * 获取UUID主键
     */
    public static String getUUID() {
        return UUID.randomUUID().toString().replace("-", "");
    }

    /**
     * 获取分布式主键
     */
    public static String getKeyID() {
        return String.valueOf(snowFlake.nextId());
    }

    /**
     * 获取SnowFlake对象
     */
    public static SnowFlake getSnowFlake() {
        return snowFlake;
    }
}